import pandas as pd
import os

def process_transactions(file_path, exchange_rates=None):
    """
    处理交易数据，按类型和币种统计总额、费用和净额，并可选择转换为USD
    
    参数:
    file_path: 文件路径，支持CSV和Excel(.xlsx)格式
    exchange_rates: 币种兑换USD的汇率字典，例如 {'EUR': 1.1, 'GBP': 1.3, ...}
    """
    # 如果未提供汇率，使用默认值
    if exchange_rates is None:
        exchange_rates = {
            'USD': 1.0,  # 美元
            'AUD': 0.64,  # 澳大利亚元
            'CAD': 0.72,  # 加拿大元
            'EUR': 1.13,  # 欧元
            'GBP': 1.34,  # 英镑
            'NZD': 0.59,  # 新西兰元
            'SGD': 0.77,  # 新加坡元
            # 可以根据需要添加更多币种
        }
    
    # 根据文件扩展名选择读取方式
    print(f"正在读取文件: {file_path}")
    file_ext = os.path.splitext(file_path)[1].lower()
    
    if file_ext == '.csv':
        df = pd.read_csv(file_path, encoding='utf-8')
    elif file_ext in ['.xlsx', '.xls']:
        df = pd.read_excel(file_path)
    else:
        raise ValueError(f"不支持的文件格式: {file_ext}，请使用CSV或Excel文件")
    
    # 确保列名正确
    expected_columns = ['类型', '币种','状态', '总额', '费用', '净额']
    for col in expected_columns:
        if col not in df.columns:
            raise ValueError(f"文件缺少必要的列: {col}")
    
    # 将金额列转换为数值类型
    for col in ['总额', '费用', '净额']:
        df[col] = pd.to_numeric(df[col], errors='coerce')
    
    # 按类型和币种分组，计算总和
    # 注意：状态列不能直接在agg中聚合，因为一个组可能有多个状态
    # 我们可以选择第一个状态作为代表，或者创建一个新的状态列
    grouped = df.groupby(['类型', '状态', '币种']).agg({
        '总额': 'sum',
        '费用': 'sum',
        '净额': 'sum',
        # '状态': 'first'  # 使用每组的第一个状态值
    }).reset_index()
    
    # 添加USD转换列
    # 添加汇率列
    grouped['汇率(转美元)'] = grouped.apply(
        lambda row: exchange_rates.get(row['币种'], 1.0), axis=1
    )
    
    grouped['总额_USD'] = grouped.apply(
        lambda row: row['总额'] * exchange_rates.get(row['币种'], 1.0), axis=1
    )
    grouped['费用_USD'] = grouped.apply(
        lambda row: row['费用'] * exchange_rates.get(row['币种'], 1.0), axis=1
    )
    grouped['净额_USD'] = grouped.apply(
        lambda row: row['净额'] * exchange_rates.get(row['币种'], 1.0), axis=1
    )
    
    return grouped

def main():
    # 获取当前脚本所在目录
    script_dir = os.path.dirname(os.path.abspath(__file__))
    
    # 构建文件的完整路径 - 支持CSV和Excel文件
    input_file = os.path.join(script_dir, '521.CSV')  # 默认使用CSV文件
    
    # 如果存在同名的Excel文件，优先使用Excel文件
    excel_file = os.path.join(script_dir, '521.xlsx')
    if os.path.exists(excel_file):
        input_file = excel_file
    
    # 可以在这里自定义汇率
    exchange_rates = {
            'USD': 1.0,  # 美元
            'AUD': 0.64,  # 澳大利亚元
            'CAD': 0.72,  # 加拿大元
            'EUR': 1.13,  # 欧元
            'GBP': 1.34,  # 英镑
            'NZD': 0.59,  # 新西兰元
            'SGD': 0.77,  # 新加坡元
            # 可以根据需要添加更多币种
      }
    
    try:
        # 处理交易数据
        result = process_transactions(input_file, exchange_rates)
        
        # 显示结果
        # print("\n按类型和币种统计结果:")
        # print(result)
        
        # 保存结果到Excel文件
        output_file = os.path.join(script_dir, 'transaction_summary1.xlsx')
        try:
            result.to_excel(output_file, index=False)
            print(f"\n结果已保存到: {output_file}")
        except PermissionError:
            print(f"\n无法保存到Excel文件: {output_file}")
            print("文件可能已被其他程序打开，请关闭后重试。")
            # 继续执行后续代码，不中断程序
        
        # 计算各币种总计
        # currency_totals = result.groupby('币种').agg({
        #     '总额': 'sum',
        #     '费用': 'sum',
        #     '净额': 'sum',
        #     '总额_USD': 'sum',
        #     '费用_USD': 'sum',
        #     '净额_USD': 'sum'
        # }).reset_index()
        
        # print("\n各币种总计:")
        # print(currency_totals)
        
        # 计算各类型总计
        # type_totals = result.groupby('类型').agg({
        #     '总额': 'sum',
        #     '费用': 'sum',
        #     '净额': 'sum',
        #     '总额_USD': 'sum',
        #     '费用_USD': 'sum',
        #     '净额_USD': 'sum'
        # }).reset_index()
        
        # print("\n各类型总计:")
        # print(type_totals)
        
        # 计算所有币种的USD总计
        usd_total = {
            '总额_USD': result['总额_USD'].sum(),
            '费用_USD': result['费用_USD'].sum(),
            '净额_USD': result['净额_USD'].sum()
        }
        
        print("\n所有币种转换为USD的总计:")
        for key, value in usd_total.items():
            print(f"{key}: {value:.2f}")
        
        # 计算快速结账付款的总额
        # 计算各类型总计
        # 筛选出多个类型的数据
        # 可以在这个列表中添加需要筛选的类型
        checkout_types = ['快速结账付款', '直接信用卡付款', '其他类型2']
        quick_checkout_df = result[(result['类型'].isin(checkout_types)) & (result['状态']=='已完成')]
        
        print("\n快速结账付款数据&已完成:")
        print(quick_checkout_df)
        
        if not quick_checkout_df.empty:
            quick_checkout_total = quick_checkout_df['总额'].sum()
            quick_checkout_total_usd = quick_checkout_df['总额_USD'].sum()
            quick_checkout_pure_usd = quick_checkout_df['净额_USD'].sum()
            
            print("\n快速结账付款总额&已完成:")
            print(f"原始币种总额: {quick_checkout_total:.2f}")
            print(f"USD总额: {quick_checkout_total_usd:.2f}")
            print(f"USD净额: {quick_checkout_pure_usd:.2f}")
        else:
            print("\n没有找到快速结账付款类型的交易")
            
    except Exception as e:
        print(f"处理数据时出错: {e}")

if __name__ == "__main__":
    main()